<?php

namespace mini;

class App {

    /**
     * 应用启动
     */
   public static function start() {
        spl_autoload_register('mini\App::autoloader');  //启动自动加载
        //加载解析路由器
        $data = self::resolveRouter();
        //启动分发器
        self::dispatchs($data);
    }

    /**
     * 设置自动加载的目录
     * @return type
     */
    private static function getAutoloadPath() {
        return array(
            'lib_path' => LIB_PATH,
            'controller_path' => dirname(dirname(__DIR__))."/demo/appliaction/",
        );
    }
    
    /**
     * 自动加载目录
     * @param type $name
     * @return boolean
     */
    public static function autoloader($name) {
        $pathList = self::getAutoloadPath();
        foreach ($pathList as $rootpath) {
            $class_path = str_replace('\\', DIRECTORY_SEPARATOR, $name);
            $file = $rootpath . $class_path . EXT;
            if (file_exists($file)) {
                require_once $file;
                if (class_exists($name, false)) {
                    
                }
            }
        }
        return true;
    }
    
    /**
     * 加载路由器
     */
    private static function resolveRouter(){
        $router = new Router();
        return $router->run(); 
    }
    
    /**
     * 分发器，用于调用控制器
     */
    private static function dispatchs($data){
        //启动控制器，调用相关的方法
        //利用PHP反射机制执行
        $className = empty($data["module"]) ? $data["controller"] : $data["module"]."\\controller\\".$data["controller"]."Controller";
        $class = new \ReflectionClass($className);
        //获取方法
        $obj = $class->newInstance(); //实例化
        $method = $class->getmethod($data["action"]);
        //执行方法
        $method->invoke($obj);
    }
}
